#!/bin/bash
###############################################################################
#       脚本名称: unit_logger.sh
#       功能描述: 日志模块完整单元测试套件（总入口）
#       作者: 林再来
#       日期: 2025-10-28
#       版本: 1.0
#       功能:
#           1、统一执行所有日志模块单元测试
#           2、生成完整的测试报告
#           3、支持选择性执行测试套件
#           4、提供详细的测试统计信息
#       依赖(插件/命令):
#           无
###############################################################################

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"

# 加载测试框架
source "$SCRIPT_DIR/../test_framework.sh"

###############################################################################
# 全局变量
###############################################################################

# 测试套件列表
declare -a TEST_SUITES=(
    "test_logger_console.sh:控制台输出器测试"
    "test_logger_file.sh:文件输出器测试"
    "test_logger.sh:日志API接口测试"
)

# 测试模式
TEST_MODE="${1:-all}"  # all, console, file, api

###############################################################################
# 辅助函数
###############################################################################

#-----------------------------------------------------------------------------
# 函数: 打印测试套件菜单
#-----------------------------------------------------------------------------
function print_test_menu() {
    echo ""
    echo "================================================"
    echo "      日志模块单元测试套件 v1.0"
    echo "================================================"
    echo ""
    echo "可用测试套件:"
    echo "  1. 控制台输出器测试 (console)"
    echo "  2. 文件输出器测试 (file)"
    echo "  3. 日志API接口测试 (api)"
    echo "  4. 运行所有测试 (all)"
    echo ""
    echo "使用方法:"
    echo "  $0 [all|console|file|api]"
    echo ""
    echo "示例:"
    echo "  $0          # 运行所有测试"
    echo "  $0 all      # 运行所有测试"
    echo "  $0 console  # 仅运行控制台测试"
    echo "  $0 file     # 仅运行文件测试"
    echo "  $0 api      # 仅运行API测试"
    echo ""
    echo "================================================"
}

#-----------------------------------------------------------------------------
# 函数: 运行单个测试套件
# 参数: $1 - 测试脚本名称
#       $2 - 测试套件描述
#-----------------------------------------------------------------------------
function run_test_suite() {
    local test_script="$1"
    local test_description="$2"
    
    local test_path="$SCRIPT_DIR/$test_script"
    
    if [[ ! -f "$test_path" ]]; then
        echo "⚠ 警告: 测试脚本不存在: $test_script" >&2
        return 1
    fi
    
    echo ""
    echo "================================================"
    echo "  执行测试套件: $test_description"
    echo "================================================"
    
    # 执行测试脚本
    bash "$test_path"
    local result=$?
    
    echo "================================================"
    echo "  测试套件完成: $test_description"
    echo "  结果: $(if [[ $result -eq 0 ]]; then echo "✓ 成功"; else echo "✗ 失败"; fi)"
    echo "================================================"
    
    return $result
}

#-----------------------------------------------------------------------------
# 函数: 运行控制台测试
#-----------------------------------------------------------------------------
function run_console_tests() {
    run_test_suite "test_logger_console.sh" "控制台输出器测试"
    return $?
}

#-----------------------------------------------------------------------------
# 函数: 运行文件测试
#-----------------------------------------------------------------------------
function run_file_tests() {
    run_test_suite "test_logger_file.sh" "文件输出器测试"
    return $?
}

#-----------------------------------------------------------------------------
# 函数: 运行API测试
#-----------------------------------------------------------------------------
function run_api_tests() {
    run_test_suite "test_logger.sh" "日志API接口测试"
    return $?
}

#-----------------------------------------------------------------------------
# 函数: 运行所有测试
#-----------------------------------------------------------------------------
function run_all_tests() {
    local total_suites=0
    local passed_suites=0
    local failed_suites=0
    
    echo ""
    echo "========================================"
    echo "  开始执行日志模块完整单元测试"
    echo "========================================"
    echo "  测试时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "  测试环境: $(uname -s)"
    echo "  Shell版本: $BASH_VERSION"
    echo "========================================"
    
    # 运行控制台测试
    ((total_suites++))
    if run_console_tests; then
        ((passed_suites++))
    else
        ((failed_suites++))
    fi
    
    # 运行文件测试
    ((total_suites++))
    if run_file_tests; then
        ((passed_suites++))
    else
        ((failed_suites++))
    fi
    
    # 运行API测试
    ((total_suites++))
    if run_api_tests; then
        ((passed_suites++))
    else
        ((failed_suites++))
    fi
    
    # 打印总结报告
    echo ""
    echo "========================================"
    echo "  测试套件总结"
    echo "========================================"
    echo "  总计: $total_suites 个测试套件"
    echo -e "  ${COLOR_GREEN}通过: $passed_suites${COLOR_RESET}"
    echo -e "  ${COLOR_RED}失败: $failed_suites${COLOR_RESET}"
    echo "  成功率: $(awk "BEGIN {printf \"%.1f\", ($passed_suites/$total_suites)*100}")%"
    echo "========================================"
    echo "  完成时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo "========================================"
    
    # 返回失败的套件数
    return $failed_suites
}

###############################################################################
# 主函数
###############################################################################

function main() {
    # 检查参数
    case "$TEST_MODE" in
        console)
            print_test_menu
            run_console_tests
            exit $?
            ;;
        file)
            print_test_menu
            run_file_tests
            exit $?
            ;;
        api)
            print_test_menu
            run_api_tests
            exit $?
            ;;
        all)
            print_test_menu
            run_all_tests
            exit $?
            ;;
        help|--help|-h)
            print_test_menu
            exit 0
            ;;
        *)
            echo "错误: 未知的测试模式: $TEST_MODE" >&2
            print_test_menu
            exit 1
            ;;
    esac
}

# 执行主函数
main

